package br.ufrpe.bsi.pvs.database.roupa;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.ufrpe.bsi.pvs.database.Conexao;
import br.ufrpe.bsi.pvs.database.DAOFactory;
import br.ufrpe.bsi.pvs.model.roupa.Estilo;
import br.ufrpe.bsi.pvs.model.roupa.Genero;
import br.ufrpe.bsi.pvs.model.roupa.Notas;
import br.ufrpe.bsi.pvs.model.roupa.Roupa;
import br.ufrpe.bsi.pvs.model.roupa.TipoCorporeo;

public class RoupaDAOImpl implements RoupaDAO {

	@Override
	public void salvar(Roupa object) {
		String insert = "INSERT INTO pvs.roupa "
				+ "(descricao, estocadas, genero, tipo_roupa_id, estilo_id, tamanho_id)"
				+ "VALUES (?, ?, ?, ?, ?, ?)";
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con.prepareStatement(insert);
			ps.setString(1, object.getDescricao());
			ps.setInt(2, object.getQuantEstoque());
			ps.setInt(3, object.getGenero().intValue());
			ps.setInt(4, object.getTipoRoupa().getId());
			ps.setInt(5, object.getEstilo().getId());
			ps.setInt(6, object.getTamanho().getId());

			ps.execute();
		} catch (Exception e) {
			System.err.println("[ADD PROBLEM] cant add roupa: " + e);
		}
	}

	@Override
	public void remover(Roupa object) {
		remover(object.getId());
	}

	@Override
	public void remover(Serializable id) {
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con
					.prepareStatement("DELETE FROM ROUPA WHERE id = ?");
			ps.setInt(1, (Integer) id);

			ps.execute();
		} catch (Exception e) {
			System.err.println("[DEL PROBLEM] cant del roupa: " + e);
		}
	}

	@Override
	public List<Roupa> listar() {
		List<Roupa> roupas = new ArrayList<>();
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con.prepareStatement("SELECT * FROM ROUPA");
			ResultSet rs = ps.executeQuery();

			while (rs.next())
				roupas.add(buildRoupa(rs));

		} catch (Exception e) {
			System.err.println("[LIST PROBLEM] cant list roupa: " + e);
		}

		return roupas;
	}

	@Override
	public Roupa pesquisar(Serializable id) {
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con
					.prepareStatement("SELECT * FROM Roupa WHERE ID = ?");
			ps.setInt(1, (Integer) id);

			ResultSet rs = ps.executeQuery();

			while (rs.next())
				return buildRoupa(rs);

		} catch (Exception e) {
			System.out.println("[DB ERROR] cant found Roupa id: " + id);
		}

		return null;
	}

	@Override
	public Roupa pesquisar(String descricao) {
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con
					.prepareStatement("SELECT * FROM Roupa WHERE DESCRICAO = ?");
			ps.setString(1, descricao);

			ResultSet rs = ps.executeQuery();

			while (rs.next())
				return buildRoupa(rs);

		} catch (Exception e) {
			System.out.println("[DB ERROR] cant found tamanho named: "
					+ descricao);
		}

		return null;
	}

	@Override
	public List<Roupa> consultarDicas(Estilo es, TipoCorporeo tc, Genero g, Notas n) {
		String query = "select * from pvs.roupa as R inner join pvs.notas as N where R.id = N.roupa_id "
				+ "and N.nota >= ? and R.estilo_id = ? and N.tipo_corporeo_id = ? and N.categoria = ?";

		List<Roupa> roupas = new ArrayList<>();
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con.prepareStatement(query);
			ps.setInt(1, n.getNota());
			ps.setInt(2, es.getId());
			ps.setInt(3, tc.getId());
			ps.setInt(4, n.getCategoria());
			ResultSet rs = ps.executeQuery();

			while (rs.next())
				roupas.add(buildRoupa(rs));

		} catch (Exception e) {
			System.err.println("[QUERY PROBLEM] cant query roupa: " + e);
		}
		return roupas;
	}

	/** recebe um result set de uma query do banco e constroi o objeto */
	private Roupa buildRoupa(ResultSet rs) throws Exception {
		Roupa r = new Roupa();

		r.setId(rs.getInt("id"));
		r.setDescricao(rs.getString("descricao"));
		if (rs.getInt("genero") == 0){
			r.setGenero(Genero.MASCULINO);
		}else{
			r.setGenero(Genero.FEMININO);
		}
		r.setQuantEstoque(rs.getInt("estocadas"));

//		NotasDAO notasdao = DAOFactory.getNotasDAO();
//		r.setListaNotas(notasdao.getNotasRoupa(r.getId()));

		EstiloDAO estilodao = DAOFactory.getEstiloDAO();
		r.setEstilo(estilodao.pesquisar(rs.getInt("estilo_id")));

		TamanhoDAO tamanhodao = DAOFactory.getTamanhoDAO();
		r.setTamanho(tamanhodao.pesquisar(rs.getInt("tamanho_id")));

		TipoRoupaDAO tiporoupadao = DAOFactory.getTipoRoupaDAO();
		r.setTipoRoupa(tiporoupadao.pesquisar(rs.getInt("tipo_roupa_id")));

		return r;
	}
}
